package com.youle.common.util;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSON;
import com.aliyun.openservices.ClientConfiguration;
import com.aliyun.openservices.oss.OSSClient;
import com.aliyun.openservices.oss.model.ObjectMetadata;
import com.aliyun.openservices.oss.model.PutObjectResult;

/**
 * 文件操作公共方法
 * @ClassName: FileUtil
 */
public class FileUtil {
	private static Log logger=LogFactory.getLog(FileUtil.class);
	/**
	 * OSSClient对象
	 */
	private static OSSClient client;
	static{
		init();
	}
	
	/**
	 * 
	  * @Description: 初始化
	  * @param ms		配置信息
	  * @author 马正正
	  * @date 2015年7月8日
	 */
	private static void init(){
		ClientConfiguration conf = new ClientConfiguration();
		conf.setMaxConnections(500);		//设置HTTP最大连接数为500
		conf.setConnectionTimeout(20000);	//设置TCP连接超时为20秒
		conf.setMaxErrorRetry(5);			//设置最大的重试次数为5
		conf.setSocketTimeout(100000);		//设置Socket传输数据超时的时间为100秒
	
		String endpoint = "http://"+ConfigProperty.getProperty("oss.endpoint")+".aliyuncs.com";
		String accessKeyId =ConfigProperty.getProperty("oss.accessKeyId") ;
		String accessKeySecret = ConfigProperty.getProperty("oss.accessKeySecret");
		client=new OSSClient(endpoint, accessKeyId, accessKeySecret, conf);
	}
	
	/**
	 * 
	  * @Description: 文件上传
	  * @param input		输入流
	  * @param fileName		文件名(可以是url形式a/b/c.txt,开头不能是/)
	  * @param lenth		文件大小(字节数)
	  * @return				文件url
	  * @author 马正正
	  * @date 2015年6月24日
	 */
	public static String uploadFile(InputStream input, String fileName, long lenth) {
		logger.info("文件上传到阿里云");
		
		String bucketName=  ConfigProperty.getProperty("oss.bucketName") ;
		String bucketUrl= StringUtils.getPathEnd(ConfigProperty.getProperty("oss.url"));
		fileName = StringUtils.getPathNotStart(fileName);
		String result = bucketUrl+fileName;					//返回OSS文件地址
		
		ObjectMetadata objectMeta = new ObjectMetadata();	//OSS上传
		objectMeta.setContentLength(lenth);
		
		long startTime = System.currentTimeMillis();
		
		PutObjectResult put=client.putObject(bucketName, fileName, input, objectMeta);
		
		logger.info("返回的结果"+JSON.toJSONString(put)+"---文件上传到oss的时间 :"+(System.currentTimeMillis()- startTime));
		
		return result;
	}
	
	/**
	 * 
	  * @Description: 文件上传
	  * @param file			文件
	  * @param fileName		文件名(可以是url形式a/b/c.txt,开头不能是/)
	  * @return
	  * @author 马正正
	  * @date 2015年6月24日
	 */
	public static String uploadFile(byte[] content, String fileName){
		return uploadFile(new ByteArrayInputStream(content), fileName, content.length);
	}
	
	public static String uploadFile(File file,String fileName){
		String path=null;
		InputStream is=null;
		try{
			is=new FileInputStream(file);
			path=uploadFile(is, fileName, file.length());
		} catch (FileNotFoundException e) {
			logger.error("",e);
		} finally{
			if(is!=null){
				try {
					is.close();
				} catch (IOException e) {
					logger.error("",e);
				}
			}
		}
		return path;
	}
	
	/**
	 * 
	  * @Description: 文件删除
	  * TODO(这里描述这个方法的执行流程 – 可选)
	  * @param fileUrl	文件路径
	  * @author 马正正
	  * @date 2015年6月24日
	 */
	public void deleteFileOSS(String fileUrl){
		 String bucketName= ConfigProperty.getProperty("oss.bucketName");
		 client.deleteObject(bucketName, fileUrl);
	}
	
	  /**
	    * 保存文件到本地
	    * @param file 文件
	    * @param path 路径本地
	    * @param url 网络路径
	    * @return
	    */
		public static String uploadFile(MultipartFile file){
			String hUrl = null;
			if(file!=null){
				String fileName =  file.getOriginalFilename();
				//获取后缀
				String fileEx;
				try {
					fileEx = StringUtils.getFileSuffix(fileName);
				} catch (Exception e1) {
					return hUrl;
				}

				fileName = StringUtils.getPathEnd(ConfigProperty.getProperty("file.save.path"))+UUID.randomUUID().toString().replace("-", "") + fileEx;
				InputStream is=null;
				try{
					is=file.getInputStream();
					hUrl=uploadFile(is, fileName, file.getSize());
				} catch (IOException e) {
					logger.error("上传到OSS失败",e);
				} finally{
					if(is!=null){
						try {
							is.close();
						} catch (IOException e) {
							logger.error("",e);
						}
					}
				}
			}
			
			return hUrl;
		}
   /**
    * 保存文件到本地
    * @param file 文件
    * @param path 路径本地
    * @param url 网络路径
    * @return
    */
	public static String saveImgageFile(MultipartFile file){
		final long MAX_SIZE = 300 * 1024 * 1024;// 设置上传文件最大值  
        // 允许上传的文件格式的列表  
		final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "png",  "swf", "bmp"}; 
		String hUrl = null;
		if(file!=null){
			String fileName =  file.getOriginalFilename();
			
			if(file.getSize() > MAX_SIZE){
				return hUrl;
			}
			//获取后缀
			String fileEx;
			try {
				fileEx = StringUtils.getFileSuffix(fileName);
			} catch (Exception e1) {
				return hUrl;
			}
			
			if(!(ArrayUtil.isContain(fileEx.substring(1), allowedExt))){
				return hUrl;
			}

			fileName = UUID.randomUUID().toString().replace("-", "") + fileEx;
	        File targetFile = new File(PathUtil.FILE_SAVE_PATH, fileName);
	        if(!targetFile.exists()){  
	            targetFile.mkdirs();  
	        }
	        //保存  
	        try {  
	            file.transferTo(targetFile);
	            hUrl = PathUtil.FILE_URL_PATH+fileName;
	        } catch (Exception e) {  
	            e.printStackTrace();
	        }
		}
		
		return hUrl;
	}
}
